package com.tencent.api.preparedstatement;

import java.sql.*;
import java.util.Scanner;

/**
 * TODO:防止注入攻击 | 演示ps的使用流程
 *
 */
public class PSUserLoginPart {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        Scanner scanner = new Scanner(System.in);
        System.out.println("输入账号：");
        String account = scanner.nextLine();
        System.out.println("输入密码：");
        String password = scanner.nextLine();

        //注册驱动
        Class.forName("com.mysql.cj.jdbc.Driver");


        //获取连接
        Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/atguigu", "root", "1234");

        /**
         *
         * statement
         *  1.创建statement
         *  2.拼接SQL语句
         *  3.发送SQL语句，获取返回的结果
         *
         *  preparedStatement
         *  1.编写SQL语句结果  不包含动态值部分的语句，动态值部分用占位符 ？ 代替， 注意：？只能替代动态值
         *  2.创建preparedStatement，并传入动态值
         *  3.动态值 占位符 赋值 ？ 单独 赋值即可
         *  4.发送SQL语句，获取返回的结果
         */
//        //创建statement
//        Statement statement = connection.createStatement();
//
//        //发送sql语句并得到返回结果
//        String sql = "select account,PASSWORD,nickname from t_user where account='"+account+"' and PASSWORD='"+password+"';";
//        ResultSet resultSet = statement.executeQuery(sql);

        //编写SQL语句
        String sql = "select * from t_user where account = ? and password = ? ;";

        //创建预编译statement并且设置SQL语句结果
        PreparedStatement preparedStatement = connection.prepareStatement(sql);

        //单独的占位符进行赋值
        /**
         * 参数1：index 占位符的位置 从左向右数 从1开始
         * 参数2：object 占位符的值  可以设置任何类型的数据，避免了拼接，使类型更加丰富
         */
        preparedStatement.setObject(1,account);
        preparedStatement.setObject(2,password);

        //发送SQL语句，获取返回的结果
        ResultSet resultSet = preparedStatement.executeQuery();//易错点：注意，这里不加参数！！！！！

        //解析结果
        if(resultSet.next()){
            System.out.println("登录成功！");
        }else {
            System.out.println("登录失败！");
        }
        //释放资源
        resultSet.close();
        preparedStatement.close();
        connection.close();
    }

}
